package com.threeti.mecool.core.application.acl;

import com.threeti.mecool.core.domain.model.acl.Orgnization;
import com.threeti.mecool.core.domain.model.acl.OrgnizationEmployee;
import com.threeti.mecool.core.domain.model.acl.User;
import com.threeti.mecool.core.domain.model.project.ProjectEmployee;

import java.util.List;

/**
 * 员工服务(员工来源于遗留系统)
 *
 * @author Jay Meng
 */
public interface EmployeeService {

  /** 取得完整的 组织机构树(整树抓取) */
  List<Orgnization> findAllOrgnizations();

  /** 根据指定的上级组织编号抓取所有的下级组织机构树(部分树抓取) */
  List<Orgnization> findAllChildOrgnizationsBy(String parentOrgCode);

  /** 取得特定机构的所有下级员工树 */
  List<OrgnizationEmployee> findAllChildEmployeesBy(String orgCode);

  OrgnizationEmployee findByEmployeeId(Long empId);

  /**
   * 取得特定用户的特定下属雇员<p/>
   *
   * 本方法是取得下属的全集，通常本方法需要配合后续业务逻辑以完整得表达特定的业务场景，详细描述见下：<br/>
   *
   * 1.在涉及下属/上级的相关业务场景中，典型地，如下属的审核者只能是从下属开始上溯，离的最近的那个具有审核权限的上级<br/>
   * 2.同样对应地, 特定上级也只能查看特定范围下属的数据<br/>
   * 3.没有审核权限的上级是看不到任何下属数据的<br/>
   * 4.如果不加控制,或者控制不正确，都有可能产生下属的上级审核者会出现多个，从而形成更复杂的联合审批，而这种场景在当前系统中是不支持的，因此出现该场景就是逻辑错误<br/>
   * 5.具有特定权限的下属(督导)，他们制定的计划如果不需要被审核，那么这些督导的相应数据(如计划)也不应该出现在本集合中<br/>
   * 6.如果从督导开始在项目组织架构树中向上上溯，未发现任何符合条件的审核者，那么该督导的相关需要被审核的数据(如计划、任务等)的状态将自动变为审核通过，从而使得相关流程正常流转下去
   *
   */
  List<ProjectEmployee> findSubordinateEmployeesOfUser(User tryUsingCurrentLoggedInUser);

  List<ProjectEmployee> findSubordinateEmployeesByEmpId(Long empId);

    List<String[]> getProjectCodeLoginNameDisplayName_subOf(String empId);
}
